package com.hiecho;

import javassist.*;
import lombok.SneakyThrows;
import org.junit.jupiter.api.Test;

import java.io.IOException;
import java.net.URL;

/**
 * @author zhenghui
 * @description: Javassist使用演示测试
 * @date 2021/4/6 6:38 下午
 */
public class JavassistTest2 {


    public static void main(String[] args) throws CannotCompileException, IOException {

        //找到本文件的路径，与之保存在一起
        URL resource = JavassistTest2.class.getClassLoader().getResource("");
        String file = resource.getFile();
        System.out.println("文件存储路径：" + file);

        ClassPool cp = ClassPool.getDefault();
        CtClass ctClass = cp.makeClass("com.hiecho.javassist.entity.Hello");

        //创建一个类名为"hello"，传递参数的顺序为(int,double)，没有返回值的类
        /*
        CtMethod（...）源代码：
        public CtMethod(CtClass returnType,//这个方法的返回值类型，
                        String mname, //（method name）方法的名字是什么
                        CtClass[] parameters, //方法传入的参数类型是什么
                        CtClass declaring //添加到哪个类中
                        ) {....}
         */
        CtMethod ctMethod = new CtMethod(CtClass.voidType, "Hello", new CtClass[]{CtClass.intType, CtClass.doubleType, CtClass.floatType}, ctClass);
        //设置hello方法的权限为public
        ctMethod.setModifiers(Modifier.PUBLIC);

        //向ctClass中添加这个方法
        ctClass.addMethod(ctMethod);

        //写入本地
        ctClass.writeFile(file);
    }

    @SneakyThrows
    @Test
    void test01() {
        URL resource = JavassistTest2.class.getClassLoader().getResource("");
        String file = resource.getFile();
        System.out.println("文件存储路径：" + file);

        ClassPool cp = ClassPool.getDefault();
        CtClass ctClass = cp.makeClass("com.hiecho.javassist.entity.Hello");

//添加一个hello1的方法
        CtMethod ctMethod = new CtMethod(CtClass.voidType, "hello1", new CtClass[]{CtClass.intType, CtClass.doubleType}, ctClass);
        ctMethod.setModifiers(Modifier.PUBLIC);
        ctClass.addMethod(ctMethod);

//添加一个int类型的，名字为value的变量
        CtField ctField = new CtField(CtClass.intType, "value", ctClass);
        ctField.setModifiers(Modifier.PRIVATE);
        ctClass.addField(ctField);


        ctClass.writeFile(file);

    }
}